package com.daji.concurrency.multithread_fundamental;

import java.time.LocalTime;

public class A05_DaemonThread {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while (true) {
                System.out.println(LocalTime.now());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    break;
                }
            }
        });
        //把该线程标记为守护线程：
        //尝试将下面一行代码注释掉，并打开，观看执行效果。如果注释掉了该代码，会使JVM一直无法退出。虽然主线程已经结束，
        //守护线程是指为其他线程服务的线程。在JVM中，所有非守护线程都执行完毕后，无论有没有守护线程，虚拟机都会自动退出。
        t.setDaemon(true);
        /*
            在守护线程中，编写代码要注意：守护线程不能持有任何需要关闭的资源，例如打开文件等，
            因为虚拟机退出时，守护线程没有任何机会来关闭文件，这会导致数据丢失。
        */
        t.start();
        //TODO 扩展：黑马JVM笔记 OOM问题：
        /*
            ## 关于OOM的问题

**问题：一个进程有3个线程，如果一个线程抛出oom，其他两个线程还能运行么?**

这个题非常容易出错。按照常理，堆空间是线程共享的，一个线程OOM了，其它所有线程应该都抛出OOM才对。但是事实上其它线程会活的好好的。

**原因：当一个线程抛出OOM异常后，它所占据的内存资源会全部被释放掉，从而不会影响其他线程的运行**

**问题2：主线程抛出异常挂掉了，子线程会活着吗？**

答案：仍然会活着！主线程正常执行完毕，或者主线程挂了，**只要子线程不是 FIXME ```守护线程```，都会活的好好的。**
        */
    }


}
